最长连续序列(Leetcode 128)

1

题目分析

   思路并不是十分困难,不要想的太复杂,原始想法会给你提供一些思路。

哈希表

拿到题目先想一想有什么方法能够求解,然后再去思考有没有优化方案。不能直接追求极致的时空复杂度。

我来分析一下第一次遇到这个题目时我的一些想法。用题目中的例子进行说明。
[100, 4, 200, 1, 3, 2],我们要求最长序列,我们首先看到的是100这个元素,如果有101这个元素,那么长度肯定要+1,如果有102这个元素,长度还要再+1,因此我们要循环查找有没有比当前元素大1的数。而且要注意有没有比当前元素小1的数,假如有99,我们就不需要考虑100这个元素,因为99也会循环查找到100,101,102等等。因此如果有比当前元素小1的数,我们就不进行查找。当没有比当前元素小1的数,说明当前元素就是某段连续序列中最小的一个数,我们开始循环查找

算法中每个元素的外层循环需要遍历一次,找到某段连续序列最小值时内层循环遍历一次,因此**时间复杂度为$O(n)$,空间复杂度为$O(n)$**。

1
2
3
4
5
6
7
8
9
10
11
class Solution:
def longestConsecutive(self, nums):
s = set(nums)
max_len = 0
for x in nums:
if x - 1 not in s:
cur_val, cur_len = x + 1, 1
while cur_val in s:
cur_val, cur_len = cur_val + 1, cur_len + 1
max_len = max(max_len, cur_len)
return max_len

刷题总结

  这个题目是字节跳动公司的算法题之一,有的小伙伴们在面试时遇到了这个问题。其实算法面试的时候代码量一般都不会特别大,但是算法的思想往往困惑了很多小伙伴,要想在面试中取得好成绩,一定要多多练习。

-------------本文结束感谢您的阅读-------------
0%